package cn.tedu.note.aop;

import org.apache.catalina.deploy.LoginConfig;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import sun.util.logging.resources.logging;

//Aspect 切面(儿), 横截面
/*
 * 切面组件, 如果需要能够使用, 必须在Spring
 * 配置文件配置.
 */
@Component
@Aspect
public class AspectDemo {
	//切面切入位置为 userService的所有方法之前
	//@Before("bean(userService)")
	public void hello(){
		System.out.println("Hello World!");
		System.out.println("在方法之前");
	}
	//@AfterReturning("bean(userService)")
	public void test1(){
		System.out.println("方法正常结束");
	}
	//@AfterThrowing("bean(userService)")
	public void test2(){
		System.out.println("方法意外结束"); 
	}
	//@After("bean(userService)")
	public void test3(){
		System.out.println("方法最终结束");
	}
	
	//@Around("bean(userService)")
	public Object test(
			ProceedingJoinPoint joinPoint) 
			throws Throwable{
		//业务方法之前
		System.out.println("业务方法之前");
		long t1 = System.currentTimeMillis();
		//调用底层的业务方法: login/regist等
		Object obj=joinPoint.proceed();
		//业务方法之后
		System.out.println("业务方法之后"+obj);
		long t2 = System.currentTimeMillis();
		//Signature: 签名, 这里返回的是业务方法签名
		Signature s=joinPoint.getSignature();
		//s是方法签名信息:包含方法名和参数类型
		System.out.println(s+":"+(t2-t1));
		return obj;
	}
}




